/**
 * @(#)ISystemProcessAuthorityService.java Aug 31, 2009
 *   
 * Copyright  (c) 2009-2010 Wilmar IT Service,  Inc.   
 * All  rights  reserved.   
 * TODO
 */

package com.wilmar.process.core.services.api;

import java.util.List;

import com.wilmar.process.entity.ProcessAuthority;
import com.wilmar.process.entity.User;
import com.wilmar.process.entity.vo.ProcessAuthorityVO;
import com.wilmar.process.exception.DirtyDataException;
import com.wilmar.process.exception.PermissionDeniedException;

/**
 * @author MaKuBEX Email:makubexnet@gmail.com
 * @version 1.0.0
 */
public interface ISystemProcessAuthorityService extends
		IBaseService<ProcessAuthorityVO, ProcessAuthority> {
	/**
	 * 获取流程定义所对应的所有权限关系
	 * 
	 * @param processDefinitionKey
	 *            流程定义名称
	 * @return 流程定义对应的所有权限列表
	 */
	public List<ProcessAuthority> getListByProcessDefinitionKey(
			String processDefinitionKey);

	/**
	 * 获取流程定义以及所在外部系统的权限关系
	 * 
	 * @param processDefinitionKey
	 * @param outerSystem
	 *            外部系统
	 * @return 流程定义对应的所有权限列表
	 */
	public List<ProcessAuthority> getListByProcessDefinitionKeyAndOuterSystem(
			String processDefinitionKey, String outerSystem);

	/**
	 * 根据用户信息（用户，用户所属机构，用户拥有角色）查找对应的流程权限关系
	 * 
	 * @param user
	 *            用户
	 * @return 返回用户权限与流程对应关系
	 */
	public List<ProcessAuthority> getListByUserInformation(User user);

	/**
	 * 删除流程定义名称对应的所有权限设定
	 * 
	 * @param processDefinitionKey
	 *            流程定义名称
	 */
	public void removeAllAuthorityByProcessDefinitionKey(
			String processDefinitionKey);

	/**
	 * 根据流程定义名称和外部系统删除对应的所有权限设定
	 * 
	 * @param processDefinitionKey
	 *            流程定义名称
	 * @param outerSystem
	 *            外部系统
	 */
	public void removeAllAuthorityByProcessDefinitionKeyAndOuterSystem(
			String processDefinitionKey, String outerSystem);

	/**
	 * 保存全部流程定义与权限关系
	 * 
	 * @param allAuthority
	 *            全部流程定义权限关系
	 */
	public void saveAllAuthority(List<ProcessAuthority> allAuthority);

	/**
	 * 判断用户是否具有触发该流程的权限
	 * 
	 * @param processDefinitionKey
	 *            流程定义Key
	 * @param user
	 *            流程实例启动用户
	 * @throws PermissionDeniedException
	 *             该用户无权启动该流程
	 * @throws DirtyDataException
	 *             数据库中含有脏数据
	 */
	public void validateStartAuthority(String processDefinitionKey, User user)
			throws PermissionDeniedException, DirtyDataException;
}
